//
// Created by xy on 2024/10/21.
//

#ifndef WEBDESK_UTILS_LOG_H_
#define WEBDESK_UTILS_LOG_H_

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <time.h>
#include <sys/wait.h>
#include <dirent.h>
#include <syslog.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <signal.h>
#include <sys/time.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#include <ctype.h>
#include <error.h>
#include <errno.h>
#include "SafeQueue.h"

// ANSI 转义序列，用于颜色渲染
#define RESET_COLOR  "\033[0m"       // 终端重置颜色
#define INFO_COLOR   "\033[32m"      // 绿色，表示 INFO
#define DEBUG_COLOR  "\033[34m"      // 蓝色，表示 DEBUG
#define WARN_COLOR   "\033[33m"      // 黄色，表示 WARN
#define ERROR_COLOR  "\033[31m"      // 红色，表示 ERROR

#define MAX_LOG_SIZE 5 * 1024 * 1024


/*
 ******************************日志库******************************
 * 等级说明:
 * debug调试信息
 * info用来收集关注的信息
 * warn警告信息
 * error错误信息：最重要的日志信息，记录越详细越好
*/

// 日志等级
typedef enum{
  LOGSTART = 0,
  INFO = 1,
  DEBUG = 2,
  WARN = 3,
  ERROR = 4,
} LOGLEVEL;

// 错误等级
typedef enum{
  ERROR0 = 1,
  ERROR1 = 2,
  ERROR2 = 3
} ERRORS;

#define LOG_NUM 4

// 单个日志
typedef struct logbase {
    char* path;
    FILE* file;
    LOGLEVEL level;
    int file_count;  // 分片计数
} LogBase;

// 日志管理器
typedef struct logmanager {
  LogBase* log[LOG_NUM];
  LOGLEVEL main_level;
  ThreadSafeCircularQueue* queue; // 缓存队列
  pthread_cond_t cond_not_empty;   // 队列非空的条件变量
  pthread_cond_t cond_not_full;    // 队列未满的条件变量
  pthread_mutex_t mutex;
  pthread_t task;
} LogManager;



// 传递给线程的参数
typedef struct threadparam{
  char data[512];
  LOGLEVEL log_level;
}ThreadParam;

// 全局日志变量声明
extern LogManager* g_log;

// 获取当前时间
char* get_current_time();

// 初始化日志管理
bool initLog(int capacity);

// 初始化日志
LogBase* initLogBase(char* path,LOGLEVEL level);

// 写入日志
bool writeLog(char* data, LOGLEVEL log_level);


// 返回日志等级
int logLevel();

// 清理日志
void closeLog();

// 日志分片处理函数
void rotate_log(LogBase* log);

// 异步执行任务的线程函数
void* async_write();

// 带颜色的日志输出宏

#define INFO_LOG(msg, ...) { \
    char buffer[512]; \
    snprintf(buffer, sizeof(buffer), INFO_COLOR "[%s] [INFO] [%s:%d] [%s] " msg RESET_COLOR, \
             get_current_time(), __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
    writeLog(buffer, INFO); \
}

#define DEBUG_LOG(msg, ...) { \
    char buffer[512]; \
    snprintf(buffer, sizeof(buffer), DEBUG_COLOR "[%s] [DEBUG] [%s:%d] [%s] " msg RESET_COLOR, \
             get_current_time(), __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
    writeLog(buffer, DEBUG); \
}

#define WARN_LOG(msg, ...) { \
    char buffer[512]; \
    snprintf(buffer, sizeof(buffer), WARN_COLOR "[%s] [WARN] [%s:%d] [%s] " msg RESET_COLOR, \
             get_current_time(), __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
    writeLog(buffer, WARN); \
}

#define ERROR_LOG(msg, ...) { \
    char buffer[512]; \
    snprintf(buffer, sizeof(buffer), ERROR_COLOR "[%s] [ERROR] [%s:%d] [%s] " msg RESET_COLOR, \
             get_current_time(), __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
    writeLog(buffer, ERROR); \
}

#endif //WEBDESK_UTILS_LOG_H_
